## The Hamming code [7,4,3]

from PyM import *

def index(s,H):
    n = len(H)
    for j in range(n):
        if s==H[j]: return j
    return 0

R =matrix(Zn(2),4,3)
R[0]=[1,1,1]
R[1]=[0,1,1]
R[2]=[1,0,1]
R[3]=[1,1,0]

# Generating matrix
G = splice(I_(4),R)
#show(G)

# Control matrix
H = stack(R,I_(3))
#show(H)


# Coding function
def f(u): 
    if isinstance(u,list):
        u = vector(u)
    return u*G

# Example
u = [1,1,0,1]
show(u)
x = f(u)
show(x)

# Simulating a channel error
y = flip(x,1)
show(y)

# Decoder function
def g(y):
    s = y*H
    j = index(s,H)
    x = flip(y,j)
    k = len(G)
    return x[:k]

# Decoded vector
show(g(y))
    
